Open
Conversation
Add art_format to echomail list queries so the JS can detect PETSCII messages, and display a small C64 badge beside the envelope icon in both the echomail and netmail message lists. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The C64 PETSCII badge was only visible from the two non-threaded flat list queries. All remaining list queries (threaded view, subscribed areas, thread context loading, child/parent loading) were also missing art_format from their SELECT clause. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sysops can now edit art_format and message_charset on any echomail message directly from the message reader. Netmail senders/receivers can do the same for their own messages. Edit button (pencil icon) lives in the message header toolbar alongside prev/next navigation. Also adds a C64 badge in message lists for PETSCII-detected messages, fixes art_format missing from echomail list queries in MessageHandler, and updates i18n keys, API routes, and UPGRADING_1.8.7 docs. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Advanced Search modal on echomail and netmail with per-field filters (poster name, subject, body) and date range picker; fields ANDed together - Simple search bar unchanged - Backend: field-specific ILIKE conditions built separately from general q= search; date range computed in PHP to avoid PDO/pgsql ::cast issues - Performance: derive echoarea and filter counts from already-fetched results instead of running two additional full-table ILIKE scans - Add trigram GIN indexes (pg_trgm) on echomail/netmail subject and message_text for fast substring search - Add index on echomail(date_received) for date range filtering - Fix search returning blank response caused by bytea raw_message_bytes column being included in SELECT em.* and returned as unserializable PHP resource - Fix stale message list showing after search failure (fail handler now clears the container) - Update UPGRADING_1.8.7.md with search and reindex notes Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New /admin/database-stats page with six tabs: size & growth, activity, query performance, replication, maintenance health, and index health - DatabaseStats class queries pg_stat_* views; gracefully degrades when extensions (pg_stat_statements) are absent - Dashboard now shows database size with link to stats page - Optional daemons (telnet, SSH, Gemini, MRC, multiplexer) shown in service status with Running/Stopped badges; no PID = stopped - database_maintenance.php now vacuums all user tables (via pg_stat_user_tables) and prints each table as it's processed - Migration v1.11.0.13 drops 10 redundant explicit indexes that duplicate unique-constraint indexes on the same columns - Proposal doc for redundant index drops with verification notes - CLAUDE.md note: do not create explicit indexes on UNIQUE columns - UPGRADING_1.8.7.md updated with database stats section; removed incorrect "no schema migration" note Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New tab on /admin/database-stats showing per-locale, per-file key counts, file sizes, and serialized memory footprint of i18n catalogs - Summary cards give a quick overview per locale; detail table groups files under each locale with totals row - Fix back button using correct ui.common.go_back key - i18n keys added for en, es, fr Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fills gaps in fr/common.php relative to en/common.php: - ui.common.advanced_search.* (advanced search modal) - ui.common.db_id, ui.common.message_id - ui.base.admin.bbs_directory, echomail_robots, bbs_lists - ui.admin.bbs_directory.* (full admin BBS directory UI) - ui.admin.echomail_robots.* - ui.admin.bbs_settings.features.enable_bbs_directory / bbs_directory_help - ui.bbs_directory.* (public directory page) - ui.echomail.art_format*, edit_message*, message_charset* - ui.files.edit, edit_file, move_to_area, scan_status_*, short_description, virus_name_placeholder Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bootstrap's contextual table classes use bright solid backgrounds that make text unreadable on dark themes. Override them in cyberpunk, dark, greenterm, and amber to use low-opacity tinted backgrounds that preserve the semantic colour signal without drowning out foreground text. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The previous fix only set --bs-table-bg but not --bs-table-striped-bg, so table-warning rows alternated between the tinted dark colour (odd/striped rows) and Bootstrap's bright #fff3cd (even rows). Add all Bootstrap table CSS variable overrides (striped, active, hover variants) so every row in a contextual table class renders consistently dark across all four themes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The daemon polls every 100ms accumulating millions of seq scans. The old index (sent_at, priority) didn't match ORDER BY priority DESC, created_at ASC so PostgreSQL chose seq scans. The new partial index covers only unsent rows with the exact sort order, enabling efficient index scans. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…sages users: add UNIQUE LOWER(username) index — covers login queries and OR-based name-matching in mail delivery that were forcing seq scans on every auth request. shared_messages: replace (message_id, message_type) index with composite (message_id, message_type, shared_by_user_id) WHERE is_active = TRUE to cover the LEFT JOIN on every echomail listing page load. saved_messages: replace (message_id, message_type) index with composite (message_id, message_type, user_id) matching the echomail-driven LEFT JOIN. chat_messages: replace total-count polling with incremental max-ID approach. The old query counted ALL messages on every 30s poll (full table scan with OR across three columns). New approach queries only rows newer than the last seen message ID, using the PK index. Stores last_chat_max_id in user meta; JS passes chat_max_id from stats response to markSeen. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…er script Map features: - Nodes grouped by system_name into a single marker per BBS; popup lists all network addresses the system appears in across different nodelists - Colour-coded markers by zone (blue=Z1, green=Z2, amber=Z3, red=Z4, purple=Z5, teal=Z6, gold=multi-zone, grey=unknown) - Map legend in bottom-right corner - Lazy-loads via /api/nodelist/map-data on first tab click - Leaflet MarkerCluster for dense areas Geocoder: - scripts/geocode_nodelist.php: geocode nodelist location strings using the shared bbs_directory_geocode_cache; supports --limit, --force, --dry-run - Migration v1.11.0.18: latitude/longitude columns on nodelist table - BbsDirectoryGeocoder: removed 32-day TTL; cache is now permanent To populate coordinates after upgrading: php scripts/setup.php php scripts/geocode_nodelist.php Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Condense stats alert to a single line with middle-dot separators; Last imported badges moved to a second line beneath the counts - Add Nodelist Map section to UPGRADING_1.8.7.md covering geocoding script usage, cron setup, zone colour coding, and new migration Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Copy dark CSS treatment from bbs_directory (dark bg, tile filters, dark controls and popups) to the nodelist Leaflet map Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Documents both geocoder scripts (nodelist and BBS directory), shared cache behaviour, Nominatim rate limiting, environment variables, and cron usage. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Rename bbs_directory_geocode_cache → geocode_cache (migration v1.11.0.19) so it serves as a common geocoding service for both BBS Directory and Nodelist - Rename backfill_bbs_directory_geocoding.php → geocode_bbs_directory.php to match the geocode_nodelist.php naming pattern - Update all references in BbsDirectoryGeocoder, scripts, and docs Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Colours are now assigned dynamically from a palette as domains are encountered in the data. Nodes on multiple domains use gold. The legend is built at runtime showing actual domain names. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…onse The networks array was missing the domain field so all markers fell through to the unknown (grey) colour. Add n.domain to the SELECT and pass it through in each network entry. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add fa-code icon button beside the edit button in echomail and netmail modal headers; button gains 'active' class when open - Remove the kludge lines heading/button from inside the message body - Kludge container stays hidden by default; toggleKludgeLines() updated to use button active state instead of updating text/icon inside body - Document change in UPGRADING_1.8.7.md Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Print button (fa-print) opens message in a clean popup window; window auto-closes via onafterprint after the dialog completes - printMessage() defined in echomail.js and netmail.js directly to avoid service worker cache timing issues - Kludge toggle moved to fa-code icon button in modal header; container hidden by default, button shows active state when open - Add ui.common.print i18n key (en + es) - Document in UPGRADING_1.8.7.md Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Merges contribution from Agent 57951 with corrections and compatibility
fixes developed during testing against MultiMail and other QWK readers.
New files:
src/Qwk/QwkBuilder.php — builds QWK/QWKE download packets
src/Qwk/RepProcessor.php — parses and imports uploaded REP packets
templates/qwk.twig — download/upload UI with QWK/QWKE selector
database/migrations/v1.11.0.34_qwk_support.sql
docs/proposals/QWK_DESIGN.md
CREDITS.md
Key fixes applied during merge and testing:
- CONTROL.DAT: added missing line 9 (FidoNet netmail conf number)
- CONTROL.DAT: fixed date format to MM-DD-YY (2-digit year)
- CONTROL.DAT: conference 0 must be listed explicitly
- Message header: password field is 12 bytes not 8; corrected all
downstream field offsets (chunks at 116, confLSB at 123)
- RepProcessor: corrected header field offsets to match 12-byte layout
- RepProcessor: use iconv() not mb_convert_encoding() for CP437
- QwkBuilder: use iconv() not mb_convert_encoding() for CP437
- Added QWK/QWKE format toggle with UserMeta persistence
- Feature flag moved to features{} block; admin toggle added
- i18n keys added for all QWK error and UI strings
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…oad limit - Add qwk_message_index table (v1.11.0.35) to store QWK logical message number → DB record mapping per user, replaced on each download - QwkBuilder: buildMessagesDat() now builds and returns a message map; persistMessageIndex() writes it to qwk_message_index (delete+insert) - RepProcessor: resolveReplyToId() and resolveNetmailToAddress() now use the message index for accurate reply threading and netmail routing; getLatestDownloadMaps() loads both conference map and message index - Add user-selectable per-download limit (500/2500/5000/10000) with MAX_MESSAGES_HARD_CAP=10000; preference saved to UserMeta - Status API returns limit and hard_cap; download route reads ?limit=N - UI: limit selector, pending notice after download, default raised to 2500 - Docs: UPGRADING_1.8.7 and README updated for QWK/QWKE support Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New table qwk_imported_hashes (v1.11.0.36) stores SHA-256 of each successfully imported REP message per user; kept indefinitely - RepProcessor checks hash before importing; skips duplicates into the skipped count so the user sees accurate numbers - Hash covers conference number, to_name, subject, and body — same reply detected regardless of how many times the REP is uploaded - Amended REP packets (original replies + new ones) import only the new messages; previously imported replies are skipped cleanly Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary by CodeRabbit
New Features
Improvements
Documentation